<?
function obtenerDirectorioSubModulo ( $ncSubModulo ) {
	$oModulo =& loadModule('documentacion');
	$cDirectorio = "";
	if ( $ncSubModulo == '' ) {
		return false;
	}
	$cSql = "SELECT SMo.cDirectorio FROM stSubModulo as SMo
					WHERE SMo.ncSubModulo = $ncSubModulo";

	return  $oModulo->oDatabase->getData($cSql);	
}

function obtenerDirectorioClase ( $cPathModule, $ncClase ) {
	$oDatabase= openMetadataDB ( $cPathModule  );
	if ( $ncClase == '' ) 	return false;

	$cSql = "SELECT SMo.cDirectorio, Cla.cDirectorio 
							FROM stClase as Cla
								LEFT JOIN stSubModulo as SMo
									ON SMo.ncSubModulo = Cla.ncSubModulo
								WHERE Cla.ncClase = $ncClase";	
	list ( $cDirectorioS, $cDirectorioC ) = $oDatabase->getArray($cSql);	
	
	$cDirectorio = $cDirectorioS ;
	if ( $cDirectorioC )  $cDirectorio .= "/" . $cDirectorioC ;
	return $cDirectorio;
}

function crearLog( $ncClase ) {
	$oModulo =& loadModule('documentacion');
	
	$cSql = "SELECT ncTipoClase, cFisico
							FROM stClase as Cla
								WHERE Cla.ncClase = $ncClase";
	list ( $ncTipoClase, $cFisico ) = $oModulo->oDatabase->getArray($cSql);
	
	if ( $cFisico  ) {                		
		$cNombreArchivo = obtenerDirectorioClase ( $ncClase );
		$cNombreArchivo .= "/datos/" . $cFisico . "_log.sql";
		
		$bExiste = file_exists($cNombreArchivo);
		
		if ( $bExiste ) {
			addMessage( "El archivo $cNombreArchivo ya existe");
		} else {
				$aCampos = $oModulo->oDatabase->getArray( "SELECT cFisico FROM stClaseAtributo WHERE ncClase = $ncClase ORDER BY cFisico");
				$cCampos = implode( ",", $aCampos ) ;
				$cSql = "SELECT $cCampos FROM $cFisico";	
				$oModulo->oDatabase->query($cSql);
				$nFd = fopen( $cNombreArchivo, "w" );
				
				while ( $oModulo->oDatabase->moveNext(0) ) {
						$cValores = "";
						foreach ( $oModulo->oDatabase->aFields as $cValor ) {
								$cValores .= $oModulo->oDatabase->dbValue ( $cValor ) . ", ";                        
						}
						
						$cValores = substr($cValores , 0, -2 ) ;
						$cSqlIns = "INSERT INTO $cFisico ( $cCampos ) VALUES ( $cValores ); \n";                        
						fwrite( $nFd, $cSqlIns );
				}                                        
			fclose( $nFd );
			chmod ($cNombreArchivo, 0775);
			addMessage( "El archivo $cNombreArchivo fue creado con el SQL : $cSql");
		}
	} else {
		addMessage("La clase $ncClase no esta configurada");
	}
}

function tieneHijosB( &$aRelaciones, $ncChild ) {
	// Version Bubble Find
	$nDesde = 0 ;
	$nHasta = count($aRelaciones) - 1;
	$bEncontrado = false;
	while ( $nDesde  < $nHasta  && !$bEncontrado ) {
		echo "$nDesde - $nHasta  " . $aRelaciones[$nDesde][0] . " - " . $aRelaciones[$nHasta][0] . " " . $aRelaciones[$nMedio][0] . '<br>';
		$nMedio = floor( ($nHasta + $nDesde ) / 2 );
		if ( $aRelaciones[$nMedio][0] > $ncChild ){
			$nHasta= $nMedio - 1;
		} elseif ($aRelaciones[$nMedio][0] < $ncChild ){
			$nDesde = $nMedio + 1;
		} else {
			$bEncontrado = true;
		}
	}
	return $bEncontrado ;
}

function tieneHijosL( &$aRelaciones, $cChild ) {
	// Version Lineal Ordenada
	$nHasta = count($aRelaciones);
        
    for ( $nRelacion = 0; $nRelacion  < $nHasta ; $nRelacion++ ) {
        if ( strcmp ( $cChild, $aRelaciones[$nRelacion][0] ) == 0 ) {
            return true;
        }	  
	}
	return false;
}

function borrarRelaciones( &$aRelaciones, $ncPadre ) {
	$nItem = 0;
	while ( $nItem < count($aRelaciones)  ) {
		if ( $aRelaciones[$nItem][1] == $ncPadre ) {
			array_splice($aRelaciones, $nItem, 1);
		} else {
			$nItem ++;
		}
	}
}

function asignarOrden() 
{
    $oModulo =& loadModule('documentacion');
    $cSql    = "SELECT ncClase, 0
                    FROM stClase as Cla
                    ORDER BY 1";
                    
    $aClases = $oModulo->oDatabase->getMatrix($cSql);
    
    $cSql = "SELECT ncClasePadre as ncClaseP, 
                    ncClaseHijo as ncClaseH, 
                    0 as bFlag 
                FROM stRelacion AS Rel
                ORDER BY 1,2";
                        	                    	
    $aRelaciones = $oModulo->oDatabase->getMatrix($cSql);
    $nOrdenT = 0;
    $bLoop = false;
     
    while ( $nOrdenT < count($aClases) && ! $bLoop ){
        $bLoop = true;
    	for ( $nTabla = 0; $nTabla < count($aClases); $nTabla++ ) {
            if ( $aClases[$nTabla][1] == 0  && !tieneHijosL( $aRelaciones, $aClases[$nTabla][0] ) ) {   
            	$bLoop = false;
            	$aClases[$nTabla][1] = ++$nOrdenT;
          
                borrarRelaciones( $aRelaciones, $aClases[$nTabla][0] );
            }
        }
    }
      
    if ( $bLoop ) {
        addMessage("Entro en Ciclo sin Fin, llego a $nOrdenT de " . count($aClases)  );
    } else {
        foreach( $aClases as $aClase ){
            $oModulo->oDatabase->update("stClase", "nOrden", $aClase[1], "WHERE", "ncClase", $aClase[0]);
        }
        
    }   
}

function apareoEstructuras( $aClases1, $aClases2, $aTodosAtributos1, $aTodosAtributos2, &$aResultadoT , &$aResultadoC, &$aResultadoP, $bComparaNombre) {
	$nContador1 = 0;
	$nContador2 = 0;
	$nClaseS = 0;
	/// Matching de Clases
	while ( $nContador1 < count($aClases1) && $nContador2 < count($aClases2) ) {	    
		$nComparacion = strcasecmp( $aClases1[$nContador1]['cId'], $aClases2[$nContador2]['cId']);
		if ( $nComparacion < 0 ) {
			/// Clase Nueva en E1
			$aResultadoT[$nClaseS++] = array( $aClases1[$nContador1]['cFisico'], '', 1 , $aClases1[$nContador1]['nId'], '');
			$nContador1++;
		} elseif ( $nComparacion > 0 ) {
			/// Clase Obsoleta en E2
			$aResultadoT[$nClaseS++] = array( '', $aClases2[$nContador2]['cFisico'], 2 , '', $aClases2[$nContador2]['nId']);
			$nContador2++;
		} else {
			/// Las Clases Existen en Ambos Entornos
			/// Matching de Atributos
			$aAtributos1 = $aTodosAtributos1[$aClases1[$nContador1]['nId']];
			$aAtributos2 = $aTodosAtributos2[$aClases2[$nContador2]['nId']];
			$ncAtributo1 = 0;
			$ncAtributo2 = 0;
			$nAtributoS = 0;
			$nResultadoT = 0;
			while ( $ncAtributo1 < count($aAtributos1) || $ncAtributo2 < count($aAtributos2) ) {
				$nResultadoC = 0;
				if ( $ncAtributo1 < count($aAtributos1) ) {
				    $cClave1 = $aAtributos1[$ncAtributo1]['cId'];
				} else {
				    $cClave1 = "ZZZ";
				}
				if ( $ncAtributo2 < count($aAtributos2) ) {
				    $cClave2 = $aAtributos2[$ncAtributo2]['cId'];
				} else {
				    $cClave2 = "ZZZ";
				}				
							
				$nComparacion = strcasecmp( $cClave1, $cClave2 );				
				//echo $aAtributos1[$ncAtributo1]['cId'] . "," . $aAtributos2[$ncAtributo2]['cId'] . "," . $nComparacion . "<br>";

				if ( $nComparacion < 0 ) {
					$aResultadoC[$nClaseS][$nAtributoS++] = array( $aAtributos1[$ncAtributo1]['cdAtributo'], '?',  1 , $aAtributos1[$ncAtributo1]['ncAtributo'], '');
					$ncAtributo1++;
					$nResultadoT = 3; // Clase es <>
				} elseif ( $nComparacion > 0 ) {
					$aResultadoC[$nClaseS][$nAtributoS++] = array( '?', $aAtributos2[$ncAtributo2]['cdAtributo'], 2 , '', $aAtributos2[$ncAtributo2]['ncAtributo']); //array( '', $aAtributos2[$ncAtributo2]['cdAtributo'], 2 , 0);					                                        
					$ncAtributo2++;
					$nResultadoT = 3; // Clase es <>
				} else {
					/// Matching de Propiedades
					$nPropiedad = ( $bComparaNombre ) ? 4 : 5;
					for ( ; $nPropiedad < count($aAtributos1[$ncAtributo1]); $nPropiedad ++ ) {
						$nComparacion = strcasecmp( $aAtributos1[$ncAtributo1][$nPropiedad], $aAtributos2[$ncAtributo2][$nPropiedad]);
						if ($nComparacion != 0 ) {
							$nResultadoT = 3; // Clase es <>
							$nResultadoC = 3; // Clase es <>
							$aResultadoP[$nClaseS][$nAtributoS][$nPropiedad] = array( $aAtributos1[$ncAtributo1][$nPropiedad], $aAtributos2[$ncAtributo2][$nPropiedad], 3 );
						} else {
							$aResultadoP[$nClaseS][$nAtributoS][$nPropiedad] = array( $aAtributos1[$ncAtributo1][$nPropiedad], $aAtributos2[$ncAtributo2][$nPropiedad], 0 );
						}
					} // Fin Por Cada Propiedad					
					$aResultadoC[$nClaseS][$nAtributoS++] = array( $aAtributos1[$ncAtributo1]['cdAtributo'], $aAtributos2[$ncAtributo2]['cdAtributo'], $nResultadoC, $aAtributos1[$ncAtributo1]['ncAtributo'], $aAtributos2[$ncAtributo2]['ncAtributo']  );
					$ncAtributo1++;
					$ncAtributo2++;
				}
			} // Fin While Por Cada Atributo

			$aResultadoT[$nClaseS++] = array( $aClases1[$nContador1]['cFisico'], $aClases2[$nContador2]['cFisico'], $nResultadoT , $aClases1[$nContador1]['nId'], $aClases2[$nContador2]['nId']);
			$nContador1++;
			$nContador2++;
		}
	}
}
?>